package br.ufpi.model.validacao;

import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.ioc.Component;
import br.ufpi.componets.ValidateComponente;
import br.ufpi.model.User;
import br.ufpi.repositories.UserRepository;
import br.ufpi.util.RegexUtil;

@Component
public class UsuarioValidacao {
	private final Validator validator;
	private final ValidateComponente validateComponente;
	private final UserRepository usuarioRepository;

	public UsuarioValidacao(Validator validator, ValidateComponente validateComponente, UserRepository usuarioRepository) {
		super();
		this.validator = validator;
		this.validateComponente = validateComponente;
		this.usuarioRepository = usuarioRepository;
	}

	/**
	 * Checks whether Field was filled
	 * 
	 * @param user
	 */
	public void validateName(User user) {
		validateComponente.validarString(user.getName(), "usuario.cadastro.nome");
	}

	/**
	 * There are two passwords entered were filled correctly
	 * 
	 * @param user
	 * @param repeatPassword
	 */
	public void validatePassword(User user, String repeatPassword) {
		int qAntes = validator.getErrors().size();
		validateComponente.validarString(user.getLogin().getPassword(), "usuario.cadastro.senha");
		validateComponente.validarString(repeatPassword, "usuario.cadastro.repetesenha");
		int qDepois = validator.getErrors().size();
		if (qAntes == qDepois)
			if (!repeatPassword.equals(user.getLogin().getPassword())) {
				validateComponente.gerarErro("usuario.cadastro.senhasdiferente", "usuario.cadastro.senhasdiferente");
			}
	}

	/**
	 * verifies that the email this completed and in the correct format and if
	 * the email is already registered
	 * 
	 * @param user
	 */
	public void validateEmail(User user) {
		String email = user.getLogin().getEmail();
		if (email != null && email.trim() != "") {
			if (!RegexUtil.validEmail(email))
				validateComponente.gerarErro("email.invalido", "email.invalido");
			if (usuarioRepository.isContainsEmail(email))
				validateComponente.gerarErro("usuario.email.cadastrado", "usuario.email.cadastrado");
		}
	}

	/**
	 * verifies that the nickName this completed and if the name is already
	 * registered
	 * 
	 * @param user
	 */
	public void validateNickName(User user) {
		int qAntes = validator.getErrors().size();
		validateComponente.validarString(user.getLogin().getNickName(), "usuario.cadastro.login");
		int qDepois = validator.getErrors().size();
		if (qAntes == qDepois) {
			if (usuarioRepository.isContainsLogin(user.getLogin().getNickName())) {
				validateComponente.gerarErro("usuario.login.cadastrado", "usuario.login.cadastrado");
			}
		}

	}
/**
 * 
 * @param user
 */
	public void validatePhone(User user) {

		int qAntes = validator.getErrors().size();
		validateComponente.validarString(user.getTelefone(), "usuario.cadastro.telefone");
		int qDepois = validator.getErrors().size();
		if (qAntes == qDepois)
			if (!RegexUtil.validPhone(user.getTelefone()))
				validateComponente.gerarErro("telefone.invalido", "telefone.invalido");

	}

	public void validarUsuario(User usuario, String senhaRepetir) {
		this.validateName(usuario);
		this.validateNickName(usuario);
		this.validatePhone(usuario);
		this.validateEmail(usuario);
		this.validatePassword(usuario, senhaRepetir);
	}
}
